#ifndef __MVDEF_SYNTACTIC_SUGAR_H__
#define __MVDEF_SYNTACTIC_SUGAR_H__

#include "mvdef.h"

/////////////////////////////////////////////////////////////////
/** try...exception...end 代码块语法封装 */
/////////////////////////////////////////////////////////////////
/* e.g.
mv_cblk_try() {
  do some code block
}
mv_cblk_exception() {
  exception code block
}
mv_cblk_end()
*/
/////////////////////////////////////////////////////////////////
/** 专用于try...exception...end接口(非0表示各自定义异常号；均会跳转到exception_do代码段调用处理) ; 禁止直接调用break关键字打断try过程!!! */
#define MVSS_CBLK_EXCEPTION_RAISE(s32_except) {_s32_cblk_exp_line=__LINE__; _s32_cblk_exception=s32_except; goto _mvss_cblk_try_out;}
/** 配套用于在try...exception接口内，读取当前异常号 */
#define _mvss_cblk_exp_line                   (_s32_cblk_exp_line)
#define _mvss_cblk_exp_code                   (_s32_cblk_exception)
/**********************************/
///< 支持扩展代码，用于二次封装
#define mvss_cblk_try(...)                                    \
{                                                             \
    __attribute__((unused)) mv_s32_t _s32_cblk_exp_line  = 0; \
    __attribute__((unused)) mv_s32_t _s32_cblk_exception = 0; \
    __VA_ARGS__;                                              \
    {

///< 支持扩展代码，用于二次封装
#define mvss_cblk_exception(...)                              \
    }                                                         \
    _mvss_cblk_try_out:                                       \
    if (_s32_cblk_exception != 0) {                           \
    __VA_ARGS__;

///< 支持扩展代码，用于二次封装
#define mvss_cblk_end(...)                                    \
    }                                                         \
    __VA_ARGS__;                                              \
}
/////////////////////////////////////////////////////////////////

#endif
